﻿#define _CRT_SECURE_NO_WARNINGS 1


//
//题目1
//打印3的倍数的数
//写一个代码打印1-100之间所有3的倍数的数字

//
////第一种3%i=余数=0，则i是3的倍数
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	for (i = 1; i <= 100; i++)
//	{
//		if (i % 3 == 0)//i是否是3的倍数
//			printf("%d ", i);
//	}
//	return 0;
//}
//
////第二种3 6 9等等3的倍数之间差了3所以也可以是i=i+3/i+=3
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	for (i = 3; i <= 100; i+=3)
//	{
//	
//			printf("%d ", i);
//	}
//	return 0;
//}









//题目2
//从大到小输出
//写代码将三个整数数 按从大到小输出。
//例如：
//输入：2 3 1
//输出：3 2 1
//排序再输出很复杂
//交换

//#include<stdio.h>
//int main()
//{
//	int a,b,c;
//	//输入三个数字
//	scanf("%d %d %d", &a, &b, &c);
////	//交换
////	//需要一个中间值
////	//先将其中一个值空出来，再将其交换，注意是将右值赋给左值
//	if (a < b)
//	{
//		int i = b;
//		b = a;
//		a = i;
//	}
//	if (a < c)
//	{
//		int i = a;
//		a = c;
//		c = i;
//	}
//	if (b < c)
//	{
//		int i = c;
//		c = b;
//		b = i;
//	}
//	//输出三个数字是从大到晓.那么a里存放必须是最大，c必须存放最小的。
//	printf("%d %d %d", a, b, c);
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//	int arr[3] = { 2,3,1};
//	int i = 0;
//	for (i = 2; i>=0; i--)
//	{
//		printf("%d ", arr[i]);
//	}
//	return 0;
//}










//题目3
//打印素数和素数的个数
//写一个代码：打印100~200之间的素数
//素数（质数）指大于1的自然数中，除了1和该数自身外，无法被其他自然数整除的数
//只能被1和它本身整除的数

//判断素数的条件
//只要数不被它小的数整除就是素数
//例如；11只要不被10 9 8 7 6 5 4 3 2 整除它就是素数
//素数从奇数中选
//拿去实除的数是大多数是偶数+3的倍数
//拿去实除的数的范围是2~根号要判断的数
//只要实除到根号判断的数
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	int flag = 1;
//	for (i = 100; i <= 200; i++)
//	{
//		int a = 0;
//		for (a = 2; a <i ; a++)
//		{
//			if (i % a == 0)//表示不是素数
//			{
//				flag = 0;
//				break;
//			}
//		}
//		if (flag == 1)
//		{
//			printf("%d", i);
//		}
//	}
//		return 0;
//}


//#include <math.h>
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	int count = 0;
//	for (i = 101; i <= 200; i+=2)
//	{
//		//判断i是否是素数
//		//2~i-1之间的数字去试除i
//		int j = 0;
//		int flag = 1;//假设是素数
//		for (j = 2; j <= sqrt(i); j++)
//		{
//			if (i % j == 0)
//			{
//				flag = 0;//不是素数
//				break;
//			}
//		}
//		if (flag == 1)
//		{
//			count++;
//			printf("%d ", i);
//		}
//	}
//	printf("\ncount = %d\n", count);
//
//	return 0;
//}



//
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	for (i = 100; i <= 200; i++)
//	{
//		printf("%d ", i);
//	}
//	return 0;
//}









//题目4
//打印闰年
// //作业内容
//打印1000年到2000年之间的闰年
// 判断闰年条件
// 1.能被4整除，不能被100整除是闰年
// 2.能被400整除是闰年
// 1成立或2成立
// && ||的使用

//#include<stdio.h>
//int main()
//#include<stdio.h>
//int main()
//{
//	int year = 0;
//	for (year = 1000; year <= 2000; year++)
//	{
//		if (year % 4 == 0 && year % 100 != 0)
//			printf("%d ", year);
//		if(year % 400 == 0)
//			printf("%d ", year);
//	}
//	return 0;
//}

//提高效率
//#include<stdio.h>
//int main()
//{
//	int year = 0;
//	for (year = 1000; year <= 2000; year++)
//	{
//		if ((year % 4 == 0 && year % 100 != 0)||(year % 400 == 0))
//			printf("%d ", year);
//	}
//	return 0;
//}




















//题目5
//最大公约数
//给定两个数，求这两个数的最大公约数
//输入：20 40
//输出：20
//条件：
// 方法1：从两个数中找出最小的那个数
// 判断是否能够同时被两个数整除
// 不能依次往下减一，再次判断，直到找到那个最大公约数为止
// 用循环while（真）直到找到最大公约数
//大小顺序
//方法2
//辗转相除法



//方法一
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	int min = 0;
//	scanf("%d %d", &a, &b);
//	min = (a < b ? a : b);
//	while (1)
//	{
//		if (a % min == 0 &&  b % min == 0)
//		{
//			printf("%d", min);
//			break;
//		}
//		else
//			min--;
//	}
//	return 0;
//}
//理解原理
//把min和a和b
//%除数和被除数是有顺序的








//
////提高效率
//////方法2：辗转相除法
//#include<stdio.h>
//int main()
//{
//	int a = 0;
//	int b = 0;
//	int tep = 0;
//	scanf("%d %d", &a, &b);
//	int r = a % b;
//	while (1)
//	{
//		if (a % b == 0)
//		{
//			printf("%d ", b);
//			break;
//		}
//		else
//		{
//			tep = a;
//			a = b;
//			b = r;
//		}
//	}
//	return 0;
//}
//交换必须是空的才能交换
// 编译器执行的顺序很重要
// 每个数的值到底该是多少想清楚

//最小公倍数






//题目6
//乘法口诀表
//作业内容
//在屏幕上输出9 * 9乘法口诀表
//查找行和列的项数和列数的关系
// 1*1=1
// 2*1=2 2*2=4
// 1*3=3 
// 。。。。
//#include<stdio.h>
//int main()
//{
//	int i, j;
//	for (i = 1; i <= 9; i++)//计算的是行数
//	{
//		for (j = 1; j <= i; j++)//计算的是每一行的项数
//		{
//			printf("%d*%d=%2d ",i,j,i*j);//%2d 好看右对齐
//			//%-2d左对齐 好看
//		}
//		printf("\n");
//	}
//	return 0;
//}




//题目7
//求最大值
//作业内容
//求10 个整数中最大值
// 交换直到找到最大值
//已知数组且已知数组中的最大值
//#include<stdio.h>
//int main()
//{
//	char arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	               //0 1 2 3 4 5 6 7 8 9
//	int max = arr[0];
// int max=0//正数可以负数不行
// //假设最大值是第一个元素
//	for (int i = 1; i <= 9; i++)
//	{
//		if (max < arr[i])
//		{
//			max = arr[i];
//		}
//	}
//	printf("%d", max);
//	return 0;
//}





//题目8
//分数求和
//作业内容
//计算1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 …… + 1 / 99 - 1 / 100 的值，打印出结果
//拆分分母和分子
// 方法1
//涉及到整数和小数
//+和-用正数和负数
//方法2
//分奇数和偶数加减
//等等


//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	int flag = 1;
//	double sum = 0;
//	for (i = 1; i <= 100; i++)
//	{
//		sum += flag*1.0 / i;
//		flag=-flag;
//		//不能使用1=-1
//	}
//	printf("%f", sum);
//	return 0;
//}
//
//
//
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	double sum = 0;
//	for (i = 1; i <= 100; i++)
//	{
//		if(i%2 != 0)
//		sum +=  1.0 / i;
//		else
//		sum -= 1.0 / i;
//		//不能使用1=-1
//	}
//	printf("%f", sum);
//	return 0;
//}
//🆗
















//题目9
//数9的个数
////作业内容
////编写程序数一下 1到 100 的所有整数中出现多少个数字9
//#include<stdio.h>
//int main()
//{
//	int i = 0;
//	int a = 0;
//	for (i = 1; i <= 100; i++)
//	{
//		if (9 == i % 10 || 9 == i / 10)//取余为9，加上肯定有9   或者除10相当90
//		{
//			a++;//计算数字
//		}
//	}
//	printf("%d ", a+1);
//	return 0;
//}















//题目10
//猜数字游戏
//菜单等逻辑
//生成1~100的随机数
//猜数字逻辑

//#include<stdio.h>
//#include<time.h>
//#include<stdio.h>
//void menu()
//{
//	printf("*******************\n");
//	printf("*******Play.1******\n");
//	printf("*******Over.0******\n");
//	printf("*******************\n");
//}
//
//
//void game()
//{
//	int ret=rand()%100+1;//1~100的随机数
//	int i = 0;
//	while (1)
//	{
//		printf("请玩家输入要猜测的数字：\n");
//		scanf("%d", &i);
//        if (i < ret)
//			printf("猜小了\n");
//		else if(i > ret)
//			printf("猜大了\n");
//		else
//		{
//			printf("恭喜你，猜中了\n");
//			break;
//		}
//	}
//}
//int main()
//{
//	
//	int input = 0;
//	srand((unsigned int)time(NULL));
//	do
//	{
//		menu();
//		printf("请玩家输入数字（0/1）：\n");
//		scanf("%d", &input);
//		if (input == 1)
//		{
//			printf("开始游戏\n");
//			game();
//		}
//		else if (input == 0)
//		{
//			printf("游戏结束\n");
//			break;
//		}
//		else
//			printf("请重新选择数字：\n");
//	} while (input);
//	return 0;
//}

///没有把那个放入循环中去了

















//题目11
//二分查找

//作业内容
//编写代码在一个整形有序数组中查找具体的某个数

//要求：找到了就打印数字所在的下标，找不到则输出：找不到。

//三个数
//left，right ，mid
//写一次二分查找
//再写循环
//下标

//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int left = 0;
//	int right = sizeof(arr) / sizeof(arr[0])-1;
//	int input = 0;
//	int a = 0;
//	printf("请输入你要查找的数字：\n");
//	scanf("%d", &input);
//	for(a=1;left<=right;a++)
//	{
//		int mid = (left + right)/ 2;
//		if (arr[mid] < input)
//		{
//			left = mid + 1;//right不变
//			
//		}
//		else if (arr[mid] > input)
//		{
//			right = mid - 1;//left不变
//		
//		}
//		else
//		{
//			printf("恭喜你找到了,下标是：%d\n",mid);
//			printf("查找的次数是：%d\n", a);
//			break;
//		}
//	}
//	if (left > right)
//		printf("很遗憾没找到\n");
//	return 0;
//}


//#include<stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int size = sizeof(arr) / sizeof(arr[0]);//就算数组的元素的个数
//	int k = 0;
//	scanf("%d", &k);//输入要查找的值
//	int flag = 0;
//	int left = 0;
//	int right = size-1;//设置左右下标
//	//分支
//	while (left <= right)
//	{
//		int mid = (left + right)/2;
//		if (arr[mid] < k)
//			left = mid + 1;
//		else if (arr[mid] > k)
//			right = mid - 1;
//		else
//		{
//			printf("找到了,下标是%d\n",mid);
//			flag = 1;//必须要设置flag
//			break;
//		}
//    }//循环体只是一次二分查找
//	if (flag == 0)//注意不是flag=0，赋值🆗
//		printf("没找到\n");
//	return 0;
//}